package com.csap.framework.oauth2.server.service;

import com.csap.framework.extension.result.ResultParam;
import com.csap.framework.oauth2.request.RolesRequest;
import com.csap.framework.oauth2.request.RolesResponse;
import com.csap.framework.oauth2.server.entity.RolesEntity;
import com.csap.framework.oauth2.server.model.RolesModel;
import com.csap.framework.util.exception.ExceptionUtils;
import com.csap.mybatisplus.extension.service.BaseCsapService;
import com.csap.mybatisplus.page.Page;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * <p>
 * 角色
 * </p>
 *
 * @author yangchengfu
 * @dateTime 2021-07-25 23:51:30
 */
public interface RolesService extends BaseCsapService<RolesEntity, RolesModel, Long> {
    /**
     * 添加角色 返回角色ID
     *
     * @param t 角色信息
     * @return 角色ID
     */
    Long insertRole(RolesModel t);

    /**
     * 根据角色id查询角色信息
     *
     * @param ids 参数
     * @return 结果
     */
    Map<Long, RolesResponse> findMapByIds(String ids);

    /**
     * 根据id查询名称数组
     *
     * @param idList 参数
     * @return 结果
     */
    List<String> findDescrByIds(List<Long> idList);

    /**
     * 获取角色的权限
     *
     * @param roleIds 角色id
     * @param roleIds
     * @return 结果
     */
    Set<String> getRolePremissions(Set<String> roleIds);

    /**
     * 获取角色的权限列表
     *
     * @param roleIds 角色列表
     * @return 结果
     */
    default Map<String, Object> getRolePermissionsMap(Set<String> roleIds) {
        return lambdaQuery()
                .select(RolesEntity::getPermissions, RolesEntity::getRoleId)
                .in(RolesEntity::getRoleId, roleIds)
                .listOptional()
                .orElse(Collections.emptyList())
                .stream()
                .collect(Collectors.toMap(i -> i.getRoleId().toString(), RolesEntity::getPermissions));
    }

    /**
     * 获取角色map映射
     *
     * @param roleIds 角色IDs
     * @return 结果
     */
    default Map<String, Object> getRoleMap(Set<String> roleIds) {
        return lambdaQuery()
                .select(RolesEntity::getName, RolesEntity::getRoleId)
                .in(RolesEntity::getRoleId, roleIds)
                .listOptional()
                .orElseThrow(() -> ExceptionUtils.mpe("权限名称不能为空"))
                .stream()
                .collect(Collectors.toMap(i -> i.getRoleId().toString(), RolesEntity::getName));
    }

    /**
     * 获取角色的名称
     *
     * @param roleId 角色id
     * @return 结果
     */
    List<String> getRole(Set<String> roleId);

    Page<RolesResponse> page(RolesRequest request, Page<RolesEntity> page);
}
